var myObject = (function () {
    var value = 0;

    return {
        increment: function (inc) {
            value += typeof inc === 'number' ? inc : 1
        },
        getValue: function () {
            return value;
        }
    };
})();


// 创建一个名为 quo 的构造函数
// 它构造出带有 get_status 方法和 status 私有属性的一个对象
var quo = function (status) {
    return {
        get_status: function () {
            return status;
        }
    };
};

var myQuo = quo('amazed');
console.log(myQuo.get_status());


// 定义一个函数，它设置一个 DOM 节点为黄色，然后把它渐变为白色
var fade = function (node) {
    var level = 1;
    var step = function () {
        var hex = level.toString(16);
        node.style.backgroundColor = '#FFFF' + hex + hex;
        if (level < 15) {
            level += 1;
            setTimeout(step, 100);
        }
    };
    setTimeout(step, 100);
};
fade(document.body);

/***
 * 糟糕的例子
 * 构造一个函数，用错误的方式给一个数组中的节点设置时间处理程序。
 * 当点击一个节点时，按照预期，应该弹出一个对话框显示节点的序号，但它总是会显示节点的数目。
 */
var add_the_handlers = function (nodes) {
    var i;
    for (i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = function (e) {
            console.log(i);
        };
    }
};

/**
 * 改良后的例子
 * 
 * 构造一个函数，用正确的方式给一个数组中的节点设置事件处理程序。
 * 点击一个节点，将会弹出一个对话框显示带节点的序号。
 */

var add_the_handlers = function (nodes) {
    var helper = function (i) {
        return function (e) {
            console.log(i);
        };
    };
    var i;
    for (i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = helper(i);
    }
};